#!/bin/bash

# Shell脚本：加载变更文件到工程目录
# 功能：
# 1. 从工作区找到最新的变更文件夹（changes_latest）
# 2. 按照原有的仓库结构将文件恢复到正确的位置
# 3. 不再进行解压操作

# 设置UTF-8编码
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

# 默认参数
ZIP_FILE_NAME="changes_latest.zip"
TEMP_DIR_NAME="changes_temp"
TARGET_DIR="${HOME}/workspace/demo"
DESKTOP_PATH=""

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -t, --target <目录>       指定目标工程目录"
    echo "  -f, --file <文件名>       指定ZIP文件名"
    echo "  -h, --help                显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0"
    echo "  $0 -t ~/my_project"
    echo "  $0 -f my_changes.zip"
    echo ""
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -t|--target)
            TARGET_DIR="$2"
            shift 2
            ;;
        -f|--file)
            ZIP_FILE_NAME="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        -*)
            echo "未知选项: $1"
            show_help
            exit 1
            ;;
        *)
            echo "未知参数: $1"
            show_help
            exit 1
            ;;
    esac
done

# 获取工作区路径（跨平台兼容）
get_workspace_path() {
    local workspace_path="$HOME/workspace"
    # 创建workspace目录（如果不存在）
    if [ ! -d "$workspace_path" ]; then
        mkdir -p "$workspace_path" 2>/dev/null
    fi
    echo "$workspace_path"
}

# 创建目录
create_directory() {
    local dir_path="$1"
    if [ ! -d "$dir_path" ]; then
        mkdir -p "$dir_path" 2>/dev/null
        local result=$?
        if [ $result -ne 0 ]; then
            echo "错误：无法创建目录 $dir_path"
            return 1
        fi
    fi
    return 0
}

# 删除目录
remove_directory() {
    local dir_path="$1"
    if [ -d "$dir_path" ]; then
        rm -rf "$dir_path" 2>/dev/null
        if [ $? -ne 0 ]; then
            echo "警告：无法删除目录 $dir_path"
            return 1
        fi
    fi
    return 0
}

# 使用PowerShell解压ZIP文件（仅限Windows）
extract_zip_with_powershell() {
    local zip_file_path="$1"
    local extract_dir="$2"
    
    # 检查是否在Windows环境中
    if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]] || [[ "$(uname)" == MINGW* ]]; then
        # 转换路径格式为Windows格式
        local win_zip_file_path=$(echo "$zip_file_path" | sed 's/^\/c/C:/g' | sed 's/\//\\/g')
        local win_extract_dir=$(echo "$extract_dir" | sed 's/^\/c/C:/g' | sed 's/\//\\/g')
        
        # 创建PowerShell脚本
        local ps_script="Expand-Archive -Path '$win_zip_file_path' -DestinationPath '$win_extract_dir' -Force"
        
        # 执行PowerShell脚本
        powershell -Command "$ps_script" 2>/dev/null
        return $?
    else
        echo "错误：PowerShell仅在Windows环境中可用"
        return 1
    fi
}

# 主程序开始
echo "变更文件加载工具"
echo "================"

# 获取工作区路径
WORKSPACE_PATH=$(get_workspace_path)
echo "工作区路径: $WORKSPACE_PATH"

# 构建源文件夹完整路径（不再使用ZIP文件）
SOURCE_DIR_PATH="$WORKSPACE_PATH/$TEMP_DIR_NAME"

# 检查源文件夹是否存在
if [ ! -d "$SOURCE_DIR_PATH" ]; then
    # 如果默认文件夹不存在，尝试使用changes_latest文件夹
    SOURCE_DIR_PATH="$WORKSPACE_PATH/changes_latest"
    if [ ! -d "$SOURCE_DIR_PATH" ]; then
        echo "错误：找不到源文件夹 $SOURCE_DIR_PATH 或 $WORKSPACE_PATH/changes_latest"
        exit 1
    fi
fi

echo "找到源文件夹: $SOURCE_DIR_PATH"

# 定义仓库路径映射（与go.sh中GCM_REPO_ORDER定义的仓库一致）
AWS="${AWS:-$HOME/workspace}"
declare -A REPO_PATHS=(
    ["matrix_index"]="$AWS/demo/matrix_html"          # X
    ["demo"]="$AWS/demo"                         # D
)

# 遍历源文件夹中的每个仓库子目录
echo "正在恢复文件到目标目录..."
for repo_dir in "$SOURCE_DIR_PATH"/*; do
    if [ -d "$repo_dir" ]; then
        repo_name=$(basename "$repo_dir")
        echo "处理仓库: $repo_name"
        
        # 获取目标仓库路径
        target_repo_path="${REPO_PATHS[$repo_name]}"
        
        # 如果找不到对应的仓库路径，跳过
        if [ -z "$target_repo_path" ]; then
            echo "警告：未找到仓库 $repo_name 的目标路径，跳过"
            continue
        fi
        
        echo "目标路径: $target_repo_path"
        
        # 创建目标仓库目录
        if ! create_directory "$target_repo_path"; then
            echo "错误：无法创建目标仓库目录 $target_repo_path"
            continue
        fi
        
        # 遍历仓库目录中的所有文件和子目录
        find "$repo_dir" -type f | while read -r source_file; do
            # 计算相对于仓库目录的相对路径
            relative_path="${source_file#$repo_dir/}"
            target_file="$target_repo_path/$relative_path"
            
            # 创建目标文件所在的目录
            target_dir=$(dirname "$target_file")
            if ! create_directory "$target_dir"; then
                echo "警告：无法创建目录 $target_dir"
                continue
            fi
            
            # 复制文件
            if cp "$source_file" "$target_file" 2>/dev/null; then
                echo "已恢复: $relative_path"
            else
                echo "警告：无法恢复文件 $relative_path"
            fi
        done
        
        echo "[OK] 仓库 $repo_name 恢复完成"
    fi
done

echo ""
echo "任务完成！"
echo "所有变更文件已恢复到正确的位置"

exit 0